// let path = require('path');
// let config = require('./config');
// let gulp = require('gulp');
// let uglify = require('gulp-uglify');
let concat = require('gulp-concat');
// let cleanCSS = require('gulp-clean-css');
// let htmlmin = require('gulp-htmlmin');
let typescript = require("gulp-typescript");
// let babel = require('gulp-babel');
// let sass = require('gulp-sass');
// let connect = require('gulp-connect');
// let template = require('gulp-template');
// let nodeNeat = require('node-neat');
// let gulpSequence = require('gulp-sequence')
// let Chalk = require('chalk');
// let through = require('through2');
// let globalVar = require('./gulp-global-let')

// function resolve(...args) {
//   return path.resolve(...args)
// }

// function arrPath(key, files) {
//   return config.map((item, i) => {
//     return files ? item[key] + files : item[key]
//   })
// }

// function err(e) {
//   console.log(Chalk.red.bold('Error: ' + e.message));
// }

// let tplConfigPath = resolve(config[0].app, 'config.js')

// let globallet = {
//   app: config[0].root,
//   translation: require(`./src/${config[0].root}/translation.fr.js`)
// }

// gulp.task('connect', () => {
//   config.map((item, i) => {
//     return connect.server({
//       port: 9000 + i,
//       root: item.compile,
//       livereload: true,
//       // host: '10.10.13.16'
//     })
//   })
// })

// gulp.task('watch', () => {
//   config.forEach((item, i) => {
//     gulp.watch(tplConfigPath, () => {
//       delete require.cache[tplConfigPath]
//       let templateConfig = require(tplConfigPath)() || {}
//       let path1 = config[i].src + '/template/**/*.html'
//       let path2 = config[i].compile
//       gulp
//         .src(path1)
//         .pipe(
//           template(templateConfig).on('error', (e) => {
//             err(e)
//           })
//         )
//         .pipe(
//           gulp.dest(path2)
//         )
//         .pipe(
//           connect.reload()
//         )
//     }).on('error', (e) => {
//       err(e)
//     })
//   })
// })

// gulp.task('html', () => {
//   config.forEach((item, i) => {
//     gulp.watch(item.src + '/template/**/*.html', ['html_' + i])
//   })
// }).task('html_0', () => {
//   let item = config[0]
//   let templateConfig = require(tplConfigPath)() || {}
//   gulp.src(item.src + '/template/**/*.html')
//     .pipe(
//       template(templateConfig).on('error', (e) => {
//         err(e)
//       })
//     )
//     .pipe(gulp.dest(item.compile))
//     .pipe(connect.reload())
// }).task('html_1', () => {
//   let item = config[1]
//   let templateConfig = require(tplConfigPath)() || {}
//   gulp.src(item.src + '/template/**/*.html')
//     .pipe(
//       template(templateConfig).on('error', (e) => {
//         err(e)
//       })
//     )
//     .pipe(gulp.dest(item.compile))
//     .pipe(connect.reload())
// })

// gulp.task('sass', () => {
//   config.forEach((item, i) => {
//     gulp.watch(item.src + '/sass/**/*.scss', ['sass_' + i])
//   })
// }).task('sass_0', () => {
//   let item = config[0]
//   gulp.src(item.src + '/sass/style.scss')
//     .pipe(
//       sass({
//         // nested：嵌套缩进的css代码，它是默认值。
//         // expanded：没有缩进的、扩展的css代码。
//         // compact：简洁格式的css代码。c
//         // compressed：压缩后的css代码。
//         outputStyle: 'expanded',
//         includePaths: nodeNeat.includePaths
//       }).on('error', (e) => {
//         err(e)
//       })
//     )
//     .pipe(gulp.dest(item.compile + '/css'))
//     .pipe(connect.reload())
// }).task('sass_1', () => {
//   let item = config[1]
//   gulp.src(item.src + '/sass/style.scss')
//     .pipe(
//       sass({
//         // nested：嵌套缩进的css代码，它是默认值。
//         // expanded：没有缩进的、扩展的css代码。
//         // compact：简洁格式的css代码。c
//         // compressed：压缩后的css代码。
//         outputStyle: 'expanded',
//         includePaths: nodeNeat.includePaths
//       }).on('error', (e) => {
//         err(e)
//       })
//     )
//     .pipe(gulp.dest(item.compile + '/css'))
//     .pipe(connect.reload())
// })

// gulp.task('typescript', () => {
//   config.forEach((item, i) => {
//     gulp.watch([
//       item.src + '/typescript/**/*.ts',
//       item.app + '/common.ts'
//     ], () => {
//       gulpSequence(`typescript_${i}`, `concat_${i}`)((err) => {
//         err && err(err)
//       })
//     })
//   })
// }).task('typescript_0', function () {
//   let item = config[0]
//   return gulp.src([
//       item.src + '/typescript/*.ts',
//       item.app + '/common.ts'
//     ])
//     .pipe(typescript({
//       target: 'es5',
//       lib: ["es2015", "es2017", "dom"]
//     }))
//     .pipe(gulp.dest(item.compile + '/js'))
// }).task('concat_0', function () {
//   let item = config[0]
//   return gulp.src([
//       item.node_modules + '/jquery/dist/jquery.min.js',
//       item.node_modules + '/md5js/dist/md5.js',
//       item.compile + '/js/common.js',
//       item.compile + '/js/index.js'
//     ])
//     .pipe(concat('index.js'))
//     .pipe(globalVar(globallet).on('error', (e) => {
//       err(e)
//     }))
//     .pipe(gulp.dest(item.compile + '/js'))
//     .pipe(connect.reload())
// }).task('typescript_1', function () {
//   let item = config[1]
//   return gulp.src([
//       item.src + '/typescript/*.ts',
//       item.app + '/common.ts'
//     ])
//     .pipe(typescript({
//       target: 'es5',
//       lib: ["es2015", "es2017", "dom"]
//     }))
//     .pipe(gulp.dest(item.compile + '/js'))
// }).task('concat_1', function () {
//   let item = config[1]
//   return gulp.src([
//       item.node_modules + '/jquery/dist/jquery.min.js',
//       item.node_modules + '/md5js/dist/md5.js',
//       item.compile + '/js/common.js',
//       item.compile + '/js/index.js'
//     ])
//     .pipe(concat('index.js'))
//     .pipe(globalVar(globallet).on('error', (e) => {
//       err(e)
//     }))
//     .pipe(gulp.dest(item.compile + '/js'))
//     .pipe(connect.reload())
// })


// gulp.task('jsmin', function () {
//   gulp.src(config.compile + '/js/*.js')
//     .pipe(gulp.dest(config.dist + '/js'))
// }).task('cssmin', function () {
//   gulp.src(config.compile + '/css/*.css')
//     .pipe(cleanCSS())
//     .pipe(gulp.dest(config.dist + '/css'));
// }).task('htmlmin', function () {
//   gulp.src(config.src + '/template/**/*.html')
//     .pipe(template(templateConfig))
//     .pipe(htmlmin({
//       collapseWhitespace: true
//     }))
//     .pipe(gulp.dest(config.dist));
// }).task('copy', function () {
//   gulp.src([
//       config.compile + '/*.xml',
//       config.compile + '/*.swf',
//     ])
//     .pipe(gulp.dest(config.dist));
//   gulp.src(config.compile + '/images/**/*')
//     .pipe(gulp.dest(config.dist + '/images'))
// })


// gulp.task('buildCopy', function () {


//   config.forEach((item, i) => {

//     if (i === 0) {
//       let templateConfig = Object.assign({}, require(tplConfigPath)('/kdyg3ds-fr/activity/20180423'))
//     } else {
//       let templateConfig = Object.assign({}, require(tplConfigPath)('/kdyg3ds-fr/activity/20180423/mb'))
//     }

//     gulp.src(item.src + '/template/**/*.html')
//       .pipe(
//         template(templateConfig).on('error', (e) => {
//           err(e)
//         })
//       )
//       .pipe(gulp.dest(item.build))


//     gulp.src(item.compile + '/images/**/*')
//       .pipe(gulp.dest(item.build + '/images'));
//     gulp.src(item.compile + '/js/index.js')
//       .pipe(gulp.dest(item.build + '/js'));
//     gulp.src(item.compile + '/css/**/*')
//       .pipe(gulp.dest(item.build + '/css'));
//   })
// })

// gulp.task('buildCopy2', function () {


//   config.forEach((item, i) => {

//     if (i === 0) {
//       let templateConfig = Object.assign({}, require(tplConfigPath)('/activity/20180516'))
//     } else {
//       let templateConfig = Object.assign({}, require(tplConfigPath)('/activity/20180516/mobile'))
//     }

//     gulp.src(item.src + '/template/**/*.html')
//       .pipe(
//         template(templateConfig).on('error', (e) => {
//           err(e)
//         })
//       )
//       .pipe(gulp.dest(item.build))


//     gulp.src(item.compile + '/images/**/*')
//       .pipe(gulp.dest(item.build + '/images'));
//     gulp.src(item.compile + '/js/index.js')
//       .pipe(gulp.dest(item.build + '/js'));
//     gulp.src(item.compile + '/css/**/*')
//       .pipe(gulp.dest(item.build + '/css'));
//   })
// })

// gulp.task('dev', ['watch', 'connect', 'html', 'sass', 'typescript']);

// gulp.task('build', ['buildCopy']);

// gulp.task('build2', ['buildCopy2']);





const gulp = require('gulp');
const chalk = require('chalk');
const envmod = require('gulp-env-modify');
const path = require('path');
const fs = require('fs');
const projectConfig = require('./project-config.json');
const gulpTemplate = require('gulp-template');
const md5 = require('md5')
const fns = require('./build/functions')


let { checkDirIsExist, msgHandler, writeDataStream, readDataStream } = fns
let env = envmod.getData()

async function createProject() {
  let rootPath = path.join(__dirname, 'src', env.DEV_ROOT)
  let demoPath = path.join(__dirname, projectConfig.demo.path)

  if (!checkDirIsExist(rootPath)) {
    fs.mkdirSync(rootPath)
  }

  for (let name in projectConfig) {
    if (name === "demo") continue;
    let item = projectConfig[name]
    let path_1 = path.join(rootPath, name)
    if (!checkDirIsExist(path_1)) {
      fs.mkdirSync(path_1)
    }
    if (name === 'template' || name === 'style' || name === 'script') {
      let filename = item.file.default
      let file_1 = path.join(path_1, filename)
      let data = ''

      switch (name) {
        case 'template':
          let demoTplDefaultFile = path.join(demoPath, projectConfig.demo.template.path, projectConfig.demo.template.file.default)
          if (checkDirIsExist(demoTplDefaultFile)) {
            await readDataStream(demoTplDefaultFile).then(html => {
              data = html
            })
          }
          let demoTplConfigFile = path.join(demoPath, projectConfig.demo.template.path, projectConfig.demo.template.file.config)
          let destTplConfigFile = path.join(path_1, projectConfig.template.file.config)
          if (checkDirIsExist(demoTplConfigFile) && !checkDirIsExist(destTplConfigFile)) {
            fs.copyFileSync(demoTplConfigFile, destTplConfigFile)
          }
          break;
        case 'script':

          let path_2 = path.join(path_1, item.common.path)

          if (!checkDirIsExist(path_2)) {
            fs.mkdirSync(path_2)
          }

          for (let fileKey in item.common.file) {
            let fileName = item.common.file[fileKey]
            let file_2 = path.join(path_2, fileName)
            let demoScriptFile = path.join(demoPath, projectConfig.demo.script.path, projectConfig.demo.script.file[fileKey])
           
            if (!checkDirIsExist(file_2) && checkDirIsExist(demoScriptFile)) {
              if (fileKey === "Main") {
                await readDataStream(demoScriptFile).then(html => {
                  writeDataStream(file_2, fileName, html.replace(/replacement/g, '_' + env.DEV_ROOT))
                })
              } else {
                fs.copyFileSync(demoScriptFile, file_2)
              }
            }
          }
          break;
      }

      if (!checkDirIsExist(file_1) || name === "script") {
        writeDataStream(file_1, filename, data, { flag: 'index', name })
      }

      if (env.HAS_MOBILE) {
        filename = item.file.mobile
        file_1 = path.join(path_1, filename)
        if (!checkDirIsExist(file_1) || name === "script") {
          writeDataStream(file_1, filename, data, { flag: 'mobile', name })
        }
      }

    }
  }

}

gulp.task('createProject', function () {
  createProject()
})

let tplConfigFile = path.join(__dirname, 'src', env.DEV_ROOT, 'template', 'config.js') // path.join(__dirname, 'test', 'config.js') 
let translationFile = path.join(__dirname, 'src', env.DEV_ROOT, 'common', 'Translation.js')
let tplPath = path.join(__dirname, 'src', env.DEV_ROOT, 'template', '**/*.html')
let rootPath = path.join(__dirname, 'src', env.DEV_ROOT)

function tplChange() {
  delete require.cache[tplConfigFile]
  let templateConfig = require(tplConfigFile) || {}
  gulp.src(tplPath).pipe(
    gulpTemplate(templateConfig).on('error', function (e) {
      msgHandler(e)
    })
  ).pipe(
    gulp.dest(rootPath)
  )
}


gulp.task('dev-watch', function () {
  tplChange()
  gulp.watch([
    tplPath,
    tplConfigFile,
    translationFile
  ], ['tpl-change'])
})
gulp.task('tpl-change', function () {
  tplChange()
})

gulp.task('default', ['createProject'])
gulp.task('dev', ['dev-watch'])



